﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Especialidade
    {
        public short EspecialidadeId { get; set; }
        public string Descricao { get; set; }
        public bool IsNew { get { return this.EspecialidadeId == 0; } }
        public bool Status { get { return this.status; } set { this.status = value; this.statusChanged = true; } }
        private bool status;
        private bool statusChanged;
        RzCorportativo.DataAccess.TiposConsulta model;

        public static Especialidade CreateInstance(short especialidadeId)
        {
            Especialidade e = new Especialidade();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            var p = db.TiposConsulta.Where(w => w.TipoConsultaId == especialidadeId).FirstOrDefault();
            if (p != null)
                e = e.CreateEspecialidade(p);
            return e;
        }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
            });
            return @result;
        }

        private TiposConsulta Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToTiposConsulta(@item);
            return @item;
        }

        private TiposConsulta Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private TiposConsulta CreateModel(RZCorporativoEntities entity)
        {
            TiposConsulta especialidade = new TiposConsulta();
            if (!this.IsNew)
            {
                especialidade = entity.TiposConsulta.Where(w => w.TipoConsultaId == this.EspecialidadeId).FirstOrDefault();
                if (especialidade == null)
                    throw new Exception("Código inválido");
            }

            especialidade.TipoConsultaId = this.EspecialidadeId;
            especialidade.Descricao = (this.Descricao ?? string.Empty).ToUpper();
            especialidade.Status = this.Status;
            return especialidade;
        }

        private Especialidade CreateEspecialidade(TiposConsulta item)
        {
            Especialidade especialidade = new Especialidade();
            especialidade.EspecialidadeId = item.TipoConsultaId;
            especialidade.Descricao = item.Descricao;
            especialidade.Status = item.Status; 
            return especialidade;
        }

        public static List<Especialidade> Listar(Especialidade especialidade)
        {
            if (especialidade == null)
                especialidade = new Especialidade();
            List<Especialidade> especialidades = new List<Especialidade>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            especialidades = db.TiposConsulta.Where(w =>
                    ((especialidade.EspecialidadeId == 0) || (especialidade.EspecialidadeId == w.TipoConsultaId)) &&
                    ((especialidade.Descricao == null || especialidade.Descricao == "") || (w.Descricao.Contains(especialidade.Descricao))) &&
                    (!especialidade.statusChanged || w.Status == especialidade.status)
                ).ToList().Select(s => especialidade.CreateEspecialidade(s)).ToList();
            return especialidades;
        }
    }
}
